ByteFisher AI 编程实战(三):Prompt Engineering 核心技法

理解了 LLM 的原理后,你会发现和 AI 沟通的关键在于精准表达。Prompt Engineering(提示词工程)就是研究如何设计输入,让 AI 输出符合预期的结果。

一、什么是 Prompt Engineering

Prompt(提示词)是你输入给 AI 的指令。Prompt Engineering 是设计和优化这些指令的方法论。

一个好的 Prompt,能把 AI 的输出质量从”能用”提升到”好用”。同一个模型,用不同的 Prompt 问同一个问题,结果可能天差地别。

1
2
3
4
5
6
7
8
9
10
11
12
同一个问题,三种 Prompt 的差异:

Prompt A:"帮我写个排序"
→ 可能得到一段最基础的冒泡排序

Prompt B:"用 C# 写一个高效的排序算法"
→ 可能会得到快速排序,但没有错误处理

Prompt C:"实现一个泛型排序方法,支持自定义排序规则,
需要处理 null 和空集合,使用 QuickSort 算法,
输出完整代码+单元测试+时间复杂度说明"
→ 得到完整的生产级代码

二、好 Prompt 的五要素框架

我总结了一个五要素框架,覆盖高质量 Prompt 的必备维度:

要素 含义 举例
角色 让 AI 扮演什么身份 “你是一名资深 C# 架构师”
任务 具体要做什么 “请为这个接口编写单元测试”
上下文 背景信息和约束条件 “项目使用 .NET 8,采用 DDD 架构”
格式 输出的结构要求 “用表格输出,第一列为方法名”
约束 限制条件 “不要使用第三方库,代码需包含注释”

坏 Prompt vs 好 Prompt

1
2
3
4
5
6
7
8
9
10
11
坏 Prompt:
"帮我写一个登录功能"
→ AI 可能生成 PHP+MySQL,完全不是你想要的栈

好 Prompt(覆盖五要素):
你是一名资深全栈开发者(角色)。
请为我的 Web 应用实现一个邮箱+密码登录功能(任务)。
后端使用 Node.js + Express,前端使用 React,数据库使用 MySQL(上下文)。
返回完整的代码文件,后端代码放在 server/ 目录(格式)。
使用 bcrypt 加密密码,使用 JWT 做身份验证(约束)。
→ AI 一次性生成你需要的完整代码

三、编程场景的 Prompt 模式

3.1 代码生成

1
2
3
4
5
6
请用 C# 实现一个泛型缓存服务:
- 支持内存缓存和 Redis 双后端
- 支持设置过期时间(绝对过期和滑动过期)
- 线程安全
- 提供同步和异步两种接口
- 输出完整代码 + 使用示例

关键:明确接口、约束、输出格式,尽量减少 AI 的猜测空间。

3.2 代码解释

1
2
3
4
5
6
7
逐行解释这段 C# 代码的作用:
[粘贴代码]

重点说明:
1. 这个方法的时间复杂度
2. 有没有潜在的线程安全问题
3. 如何优化

适合接手遗留代码、审查同事代码、学习开源项目。

3.3 代码重构

1
2
3
4
5
6
7
这段代码虽然能跑,但可维护性很差。请帮我重构:
- 将业务逻辑和基础设施分离
- 引入接口抽象
- 添加依赖注入
- 保持行为不变

原始代码:[粘贴代码]

重构 Prompt 的关键是明确重构目标(性能?可读性?可测试性?)和保持行为不变

3.4 测试生成

1
2
3
4
5
6
为下面的函数生成单元测试:
- 覆盖正常路径、边界值、异常路径
- 使用 xUnit + Moq 框架
- 测试方法命名遵循 Given_When_Then 模式

被测代码:[粘贴代码]

测试生成是 AI 编程中回报率最高的场景之一。覆盖率高、速度快,尤其适合边界值测试用例。

四、高阶 Prompt 技巧

4.1 思维链(Chain of Thought)

让 AI 分步骤推理,而不是直接给答案。这个方法对复杂任务特别有效:

1
2
3
4
5
6
你需要在接手一个旧项目后,分析它的架构问题。
请按以下步骤:
1. 先列出这个项目的所有功能和模块
2. 分析每个模块的职责是否单一
3. 指出模块间的耦合点
4. 给出分步骤的重构建议

思维链的原理是模拟人类解决复杂问题的过程——先拆解问题,再逐步解决。对 AI 来说,这能显著减少”跳跃式结论”的错误。

4.2 少样本学习(Few-Shot)

给出几个输入输出的示例,让 AI 按模式执行:

1
2
3
4
5
6
7
8
9
请将以下 C# 方法名转换为对应的 SQL 查询:

GetUserById → SELECT * FROM Users WHERE Id = @Id
GetOrdersByUserId → SELECT * FROM Orders WHERE UserId = @UserId

请转换:
UpdateUserEmail
DeleteExpiredSessions
CountActiveUsersByRole

少样本特别适合输出格式一致性要求高的场景——API 文档生成、数据格式转换、代码风格统一。

4.3 角色锚定

1
2
你是一名拥有 10 年经验的 Unity 技术专家,专注于性能优化。
我下面这段代码在移动端有卡顿问题,请分析瓶颈并给出优化方案。

角色设定让 AI 使用特定领域的术语和思维方式。尝试”你是一名…”开头,输出质量会显著提升。

4.4 输出格式约束

1
2
3
4
5
6
请用 JSON 格式输出分析结果,包含以下字段:
{
"issues": ["问题1", "问题2"],
"severity": "high|medium|low",
"suggestions": ["建议1", "建议2"]
}

格式约束让 AI 输出可直接被程序消费的结构化数据,适合集成到自动化工作流中。

4.5 对比分析 Prompt

1
2
3
4
5
对比以下两种方案,用表格呈现:
- 方案A:SQLite + WAL 模式
- 方案B:PostgreSQL

对比维度:性能、部署复杂度、成本、一致性保证、并发能力

对比 Prompt 利用 AI 的知识广度,帮你快速做出技术选型。

五、Prompt 模板库

5.1 代码生成模板

1
2
3
4
5
角色:你是一名[语言/框架]专家
任务:请用[语言]实现[功能]
上下文:项目使用[框架/架构],数据库为[类型]
格式:输出完整代码文件,放在[目录]下
约束:使用[库/模式],遵循[规范]

5.2 调试模板

1
2
3
4
5
6
问题:[报错信息/异常表现]
上下文:[粘贴相关代码]
环境:[语言版本/操作系统/依赖版本]
预期行为:[应该发生什么]
实际行为:[实际发生了什么]
已尝试过的排查:[如果不确定就说"尚未排查"]

5.3 代码审查模板

1
2
3
4
审查目标:[安全/性能/可读性/全部]
代码:[粘贴代码]
特殊关注:[如果有关注点就说出来]
输出格式:按严重程度排序的列表,每条附代码行号和修复建议

5.4 架构设计模板

1
2
3
4
需求描述:[一句话说清要做什么]
技术栈:[语言/框架/基础设施]
约束条件:[性能要求/团队规模/时间限制]
输出格式:系统架构图描述(mermaid)、模块划分表格、技术选型对比

六、Prompt 反模式与最佳实践

反模式 表现 正确做法
太笼统 “帮我写个网站” 明确功能、技术栈、页面结构
多问题混问 一次问 5 个不相关的问题 拆成多轮对话,每轮一个主题
不给上下文 直接贴代码说”优化它” 说明项目背景、优化目标
过度约束 要求 AI 用过时的框架 给 AI 合理的选择空间
不验证 直接使用生成代码投入生产 审查后再合并
无反馈 不满意就重开对话 指出具体问题,让 AI 迭代修改

5.1 Prompt 迭代策略

不要期望一次 Prompt 就完美。高质量输出通常经过多轮迭代:

1
2
3
4
第1轮:生成初稿 → 审查 → 指出问题
第2轮:"这部分逻辑太复杂,请拆成两个方法"
第3轮:"添加 null 检查和边界情况处理"
第4轮:"为这个类添加 XML 文档注释"

每次迭代针对一个具体的改进方向,比一次性提所有要求效果更好。

七、实战练习

试着自己写一个 Prompt 完成以下需求:

1
2
3
4
5
6
7
8
9
10
11
练习 1:为以下 C# 方法生成单元测试
- 方法签名为 public async Task<User> GetUserByIdAsync(int id)
- 使用 xUnit + Moq
- 覆盖用户存在、不存在、数据库异常三种情况

练习 2:用英文写一段 Prompt,让 AI 将以下代码从 JavaScript 翻译为 TypeScript
- 添加完整的类型定义
- 保持运行时行为不变
- 用 interface 定义对象类型

练习 3:设计一个 Prompt 模板,用于你自己的项目中生成统一的 API 控制器代码

本章小结

  • 好的 Prompt 包含五个要素:角色、任务、上下文、格式、约束
  • 编程场景有四种常用 Prompt 模式:生成、解释、重构、测试
  • 思维链和少样本学习是提升输出质量的两大利器
  • 对比分析 Prompt 适合技术选型和方案评估
  • Prompt 需要迭代——先出初稿,再逐步精修
  • 避免笼统、不给上下文、多问题混问等常见反模式
  • 花 30 秒优化 Prompt,能节省 30 分钟的沟通成本

下一篇我们将搭建 AI 编程所需的开发环境。

ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
分享: